#!/usr/bin/env bash
#-------------------------------------------------------
#	FileName	: run.sh
#	Author		：hpy
#	Date		：2020年07月06日
#	Description	：实现任务提醒
#-------------------------------------------------------
DIR=$(dirname $0)
cd $DIR
APPNAME="MyTask"
DIR=$(pwd) 
DB="$DIR/db.dat" #任务存放数据库
TIMEDB="$DIR/time.dat"
PIC="$DIR/icon.jpg"
FLAG=0 #模式控制 
FLAG_FILE="$DIR/flag.dat"
RUNTASK="$DIR/run.flag"
TaskId="0"
TaskTime="0"
TaskNote="无"
History="$DIR/History.dat"
#主函数
function main(){
	
	
	if [[ $(cat $RUNTASK) -eq 1 ]];then 
		zenity --info --text="检测到本应用已开启了一个，将会自动退出本次新的启动！"
		exit 0
	fi
	echo 1 > $RUNTASK
	frame
	exit 0
}

#创建任务
createTask(){
	if [ ! -f $DB ];then
		touch $DB
	fi
	#添加任务
	tList=$(zenity --forms --title="添加任务" \
	--text="完善以下信息"  \
	--separator="|"  \
	--add-entry="时间(分钟)"  \
	--add-entry="任务说明"  )
	
	time=$(echo $tList | cut -d'|' -f1 )
	note=$(echo $tList | cut -d'|' -f2 )
	
	if [ -n "$(echo $time | sed -n "/^[0-9]\+$/p")" ] && [ -n "$note" ];then
		id=$(date +%Y%m%d%H%M%S)
		echo "$id|$tList" >> $DB 
		zenity --info --text="MyTask:完成任务添加！"
	else
		zenity --error --text="MyTask:预计时间输入的不是数字！或者任务说明没有输入！"
		return 
	fi 
		
}

#任务几时开始
beginTask(){
	while [[ $(flag_get) -eq 1 ]]
	do 
		if [ ! -f $DB ];then
			zenity --info --text="不存在任务!"
			return 1
		fi

		taskNow=$(cat $DB | head -n +1)
		
		if [ -z "$taskNow" ];then
			zenity --info --text="不存在任务！退出任务列表！"
			flag_cfg 0
			exit 0
		fi
		TaskId=$(echo $taskNow | cut -d'|' -f1)
		TaskTime=$(echo $taskNow | cut -d'|' -f2)
		TaskNote=$(echo $taskNow | cut -d'|' -f3)
		zenity --notification\
    	--window-icon="$PIC" \
    	--text="MyTask:已开启 [--$TaskNote--] 任务！预计时间$TaskTime分钟！"

		calTimer $taskNow $TaskId $TaskTime $TaskNote #任务计时器
	done
}

#分钟计时器 calTimer m  等待m
calTimer(){
	timeM=$3
	taskNow=$1
	TaskId=$2
	TaskTime=$3
	TaskNote=$4

	while [[ $timeM -gt 0 ]] && [[ $(flag_get) -eq 1 ]]  #分钟
	do
		echo $timeM > $TIMEDB
		secCnt=0
		if [[ $timeM -eq 1 ]];then
			zenity --notification\
    		--window-icon="$PIC" \
    		--text="MyTask:\"$TaskNote\"任务还有1分钟！"
		fi
		while [[ $secCnt -lt 60 ]]&& [[ $(flag_get) -eq 1 ]]
		do
			sleep 1
			#echo $secCnt
			secCnt=$[secCnt+1]
		done 
		timeM=$[timeM-1]
	done

	if [[ $(flag_get) -eq 0 ]];then
		zenity --notification\
    	--window-icon="$PIC" \
    	--text="MyTask:结束应用!"

		exit 0
	fi
	#zenity --info --text="任务时间到！"
	zenity --question --text="MyTask:任务完成！是否将已完成的任务删除！"
	if [[ $? -eq 0 ]];then
		echo $taskNow >> $History  #加入历史任务列表
		sed -i '1d' $DB 
		zenity --notification\
    	--window-icon="$PIC" \
    	--text="MyTask:已从任务列表中移除已完成的任务!"
	else
		zenity --notification\
    	--window-icon="$PIC" \
    	--text="MyTask:任务未完成，继续保留！"
	fi	
	zenity --question --text="MyTask:是否开启新的任务！"
	if [[ $? -eq 0 ]];then
		zenity --notification\
    	--window-icon="$PIC" \
    	--text="MyTask:已开启新的任务！"
	else
		zenity --notification\
    	--window-icon="$PIC" \
    	--text="MyTask:退出任务列表！"
		flag_cfg 0
	fi	
}

frame(){
	flag_cfg 0
	echo 0>$TIMEDB
	STATUS="工作状态"
	CREATETASK="添加任务"
	TASKLIST="任务列表"
	HISTASK="历史任务"
	NOWTASK="当前任务"
	CLEAR="清除历史"
	DELTASK="删除任务"
	QUIT="退出应用"
	while((1))
	do
		##1，列表单选框
		cmd=$(zenity --list --radiolist --width 150 --height 300 \
			--text="任务菜单" \
			--column="选择" \
			--column="功能" \
			TRUE $NOWTASK\
			FALSE $STATUS\
			FALSE $CREATETASK\
			FALSE $TASKLIST\
			FALSE $HISTASK\
			FALSE $DELTASK\
			FALSE $CLEAR\
			FALSE $QUIT)
		## 处理自定义函数的结果
		case $cmd in
			$STATUS)
				if [[ $(flag_get) -eq 0 ]];then
					zenity --question --text="当前处于暂停状态，是否开启任务？"
					if [[ $? -eq 0 ]];then
						FLAG=1
						flag_cfg 1
						beginTask & 
					else
						FLAG=0
						flag_cfg 0
					fi
					#test $? -eq 0 && FLAG=1 || FLAG=0
				else
					echo "+++++++++++++++++++++++++++++"
					taskNow=$(cat $DB | head -n +1)
		
					if [ -z "taskNow" ];then
						zenity --info --text="不能存在任务！"
					fi
					TaskId=$(echo $taskNow | cut -d'|' -f1)
					TaskTime=$(echo $taskNow | cut -d'|' -f2)
					TaskNote=$(echo $taskNow | cut -d'|' -f3)
					zenity --question --text="TaskId:$TaskId\nTaskNote:$TaskNote\n是否停止任务计时器！"
					#test $? -eq 0 && FLAG=0 || FLAG=1
					if [[ $? -eq 0 ]];then
						FLAG=0
						flag_cfg 0
					else 
						FLAG=1
						flag_cfg 1
					fi
				fi 
				;;
			$CREATETASK)
				createTask  ;;
			$TASKLIST)
				dis_task $DB "任务列表" 
				;;
			$QUIT)
				FLAG=0
				echo 0 > $RUNTASK
				flag_cfg 0
				break
				;;
			$HISTASK)
				dis_task $History "已完成的任务列表"
				;;
			$NOWTASK)
					nowTask
				;;
			$CLEAR)
				cat /dev/null > $History ;;
			$DELTASK)
				delTask
				;;
			*)	
				FLAG=0
				echo 0 > $RUNTASK
				flag_cfg 0
				break;;	
		esac
	done
}

flag_cfg(){
	echo $1 > $FLAG_FILE
	FLAG=$1
}
flag_get(){
	FLAG=$(cat $FLAG_FILE)
	echo $FLAG
}

#显示任务列表
dis_task(){
	list_cmd="zenity --list --title='$2' --column='ID' --column='时间(分钟)' --column='任务说明'"
	while read line
	do
		d1=$(echo $line | cut -d'|' -f1 )
		d2=$(echo $line | cut -d'|' -f2 )
		d3=$(echo $line | cut -d'|' -f3 ) 
		list_cmd="$list_cmd '$d1' '$d2' '$d3'"
	done < $1
	eval $list_cmd
}
#当前任务
nowTask(){
	if [[ $(flag_get) -eq 0 ]];then
		zenity --notification\
    	--window-icon="$PIC" \
    	--text="MyTask:当前没有正在执行的任务！"
	else
		line=$(cat $DB | head -n +1) 
		d1=$(echo $line | cut -d'|' -f1 )
		d2=$(echo $line | cut -d'|' -f2 )
		d3=$(echo $line | cut -d'|' -f3 ) 
		ltime=$(cat $TIMEDB) 
		zenity --notification\
    	--window-icon="$PIC" \
    	--text="MyTask:正在执行的任务为[--$d3--],剩余$ltime分钟！"
	fi
}
#删除任务
delTask(){
	list_cmd="zenity --list --title='$2' --column='ID' --column='时间(分钟)' --column='任务说明'"
	tfile="$DIR/tfile.tmp"
	if [[ $(flag_get) -eq 0 ]];then
		cat $DB > $tfile
	else
		tail -n +2 $DB > $tfile
	fi
	while read line
	do
		d1=$(echo $line | cut -d'|' -f1 )
		d2=$(echo $line | cut -d'|' -f2 )
		d3=$(echo $line | cut -d'|' -f3 ) 
		list_cmd="$list_cmd '$d1' '$d2' '$d3'"
	done < $tfile
	ans=$(eval $list_cmd)
	echo "hello:$ans"
	if [ -z $ans ];then
		return
	fi
	zenity --question --text="你确定要删除这个任务吗？"
	if [[ $? -eq 0 ]];then
		cmd_str="sed -i '/$ans/d' $DB"
		eval $cmd_str
		zenity --notification\
    	--window-icon="$PIC" \
    	--text="MyTask:已删除ID为$ans的任务！请选择工作状态，重新启动任务!"
	fi
}
#调用主函数
main


